Commit the UTM handlers for unicsv that I implemented in November.
authorrobertl <robertl>
Sun, 11 Apr 2010 22:45:05 +0000 (22:45 +0000)
committerrobertl <robertl>
Sun, 11 Apr 2010 22:45:05 +0000 (22:45 +0000)
csv_util.c
xcsv_tokens.gperf
xcsv_tokens.in

index 3d3ce6a7645f11fa8c6650315e5643cfe6b75375..9a33bfe0854c3f3f75386740cd3e056b31ab3a9a 100644 (file)
@@ -126,6 +126,12 @@ typedef enum {
        XT_TRACK_NAME,
        XT_TRACK_NEW,
        XT_URL,
+        XT_UTM,
+        XT_UTM_ZONE,
+        XT_UTM_ZONEC,
+        XT_UTM_ZONEF,
+        XT_UTM_EASTING,
+        XT_UTM_NORTHING,
        XT_URL_LINK_TEXT,
        XT_YYYYMMDD_TIME
 } xcsv_token;
@@ -149,6 +155,9 @@ static int waypt_out_count;
 static route_head *csv_track, *csv_route;
 #endif // CSVFMTS_ENABLED
 
+static double utm_northing, utm_easting, utm_zone = 0;
+static char utm_zonec;
+
 /*********************************************************************/
 /* csv_stringclean() - remove any unwanted characters from string.   */
 /*                     returns copy of string.                       */
@@ -1038,6 +1047,34 @@ xcsv_parse_val(const char *s, waypoint *wpt, const field_map_t *fmp,
        parse_coordinates(s, DATUM_OSGB36, grid_bng,
                &wpt->latitude, &wpt->longitude, MYNAME);
        break;
+    case XT_UTM_ZONE:
+        utm_zone = atoi(s);
+        break;
+    case XT_UTM_ZONEC:
+        utm_zonec = atoi(s);
+        break;
+    case XT_UTM_ZONEF:
+        utm_zone = atoi(s);
+        utm_zonec = s[strlen(s) - 1];
+        break;
+    case XT_UTM_EASTING:
+        utm_easting = atof(s);
+        break;
+    case XT_UTM_NORTHING:
+        utm_northing = atof(s);
+        break;
+    case XT_UTM: {
+        char *ss;
+        int i = 0;;
+
+        utm_zone = strtod(s, &ss);
+        utm_zonec = ss[i];
+        ss++;
+        utm_easting = strtof(ss, &ss);
+        while(*ss && !isdigit(*ss)) ss++;
+        utm_northing = strtof(ss, NULL);
+        }
+        break;
     /* ALTITUDE CONVERSIONS ************************************************/
     case XT_ALT_FEET:
        /* altitude in feet as a decimal value */
@@ -1272,6 +1309,10 @@ xcsv_data_read(void)
     ogue_t *ogp;
     route_head *rte = NULL;
     route_head *trk = NULL;
+    utm_northing = 0;
+    utm_easting = 0;
+    utm_zone = 0;
+    utm_zonec = 'N';
     
     csv_route = csv_track = NULL;
     if (xcsv_file.datatype == trkdata) {
@@ -1342,11 +1383,21 @@ xcsv_data_read(void)
                 s = csv_lineparse(NULL, xcsv_file.field_delimiter, "",
                   linecount);
             }
+
             if ((xcsv_file.gps_datum > -1) && (xcsv_file.gps_datum != GPS_DATUM_WGS84)) {
                double alt;
                GPS_Math_Known_Datum_To_WGS84_M(wpt_tmp->latitude, wpt_tmp->longitude, 0.0,
                    &wpt_tmp->latitude, &wpt_tmp->longitude, &alt, xcsv_file.gps_datum);
            }
+
+            if (utm_easting || utm_northing) {
+                GPS_Math_UTM_EN_To_Known_Datum(&wpt_tmp->latitude,
+                                               &wpt_tmp->longitude,
+                                               utm_easting, utm_northing,
+                                               utm_zone, utm_zonec,
+                                               DATUM_WGS84);
+            }
+
            switch(xcsv_file.datatype) {
                case 0:
                case wptdata:
@@ -1410,6 +1461,9 @@ xcsv_waypt_pr(const waypoint *wpt)
     field_map_t *fmp;
     queue *elem, *tmp;
     double latitude, longitude;
+    int32 utmz;
+    double utme, utmn;
+    char utmzc;
 
     buff[0] = '\0';
     
@@ -1653,6 +1707,44 @@ xcsv_waypt_pr(const waypoint *wpt)
                snprintf(buff, sizeof(buff), fmp->printfc, map, (int)(east + 0.5), (int)(north + 0.5));
                }
            break;
+        case XT_UTM: {
+                char tbuf[100];
+                GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
+                                         &utme, &utmn, &utmz, &utmzc);
+                snprintf(tbuf, sizeof(tbuf), "%d%c %6.0f %7.0f", 
+                         utmz, utmzc, utme, utmn);
+                writebuff(buff, fmp->printfc, tbuf);
+                }
+                break;
+        case XT_UTM_ZONE:
+                GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
+                                         &utme, &utmn, &utmz, &utmzc);
+                writebuff(buff, fmp->printfc, utmz);
+                break;
+        case XT_UTM_ZONEC:
+                GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
+                                         &utme, &utmn, &utmz, &utmzc);
+                writebuff(buff, fmp->printfc, utmzc);
+                break;
+        case XT_UTM_ZONEF: {
+                GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
+                                         &utme, &utmn, &utmz, &utmzc);
+                char tbuf[10];
+                tbuf[0] = 0;
+                snprintf(tbuf, sizeof(tbuf), "%d%c", utmz, utmzc);
+                writebuff(buff, fmp->printfc, tbuf);
+                }
+                break;
+        case XT_UTM_NORTHING:
+                GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
+                                         &utme, &utmn, &utmz, &utmzc);
+                writebuff(buff, fmp->printfc, utmn);
+                break;
+        case XT_UTM_EASTING:
+                GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
+                                         &utme, &utmn, &utmz, &utmzc);
+                writebuff(buff, fmp->printfc, utme);
+                break;
 
         /* ALTITUDE CONVERSIONS**********************************************/
         case XT_ALT_FEET:
index 4cb3f4871c45d7f7fcb2fee9146cceb63cbec1a8..a525f4a0cb225c8f85e2db79924f3071df72f597 100644 (file)
@@ -1,4 +1,4 @@
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.1 */
 /* Command-line: gperf -L ANSI-C -D -t xcsv_tokens.in  */
 /* Computed positions: -k'2,4-5,12,$' */
 
@@ -32,7 +32,7 @@
 #line 1 "xcsv_tokens.in"
 struct xt_mapping {char *name; int xt_token; };
 
-#define TOTAL_KEYWORDS 75
+#define TOTAL_KEYWORDS 81
 #define MIN_WORD_LENGTH 3
 #define MAX_WORD_LENGTH 21
 #define MIN_HASH_VALUE 5
@@ -58,9 +58,9 @@ hash (register const char *str, register unsigned int len)
       186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
       186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
       186, 186, 186, 186, 186,   0, 186,   0,   0,   0,
-       70,   0,  30,  45, 186,  30,  50,  35,   5,  15,
-       25, 186,   0,  70,   0, 186,   0,   5,  30,  25,
-      186, 186, 186, 186, 186,  20, 186, 186, 186, 186,
+       50,  20,  30,  60, 186,  30,  50,  35,   5,  15,
+       45, 186,   0,  70,   0, 186,  15,   5,  35,  20,
+       80, 186, 186, 186, 186,  20, 186, 186, 186, 186,
       186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
       186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
       186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
@@ -107,9 +107,6 @@ hash (register const char *str, register unsigned int len)
 
 #ifdef __GNUC__
 __inline
-#ifdef __GNUC_STDC_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
 #endif
 struct xt_mapping *
 in_word_set (register const char *str, register unsigned int len)
@@ -138,8 +135,6 @@ in_word_set (register const char *str, register unsigned int len)
       {"GEOCACHE_ISARCHIVED", XT_GEOCACHE_ISARCHIVED},
 #line 19 "xcsv_tokens.in"
       {"GEOCACHE_ISAVAILABLE", XT_GEOCACHE_ISAVAILABLE},
-#line 34 "xcsv_tokens.in"
-      {"IGNORE", XT_IGNORE},
 #line 15 "xcsv_tokens.in"
       {"GEOCACHE_CONTAINER", XT_GEOCACHE_CONTAINER},
 #line 68 "xcsv_tokens.in"
@@ -150,8 +145,6 @@ in_word_set (register const char *str, register unsigned int len)
       {"LAT_DIR", XT_LAT_DIR},
 #line 58 "xcsv_tokens.in"
       {"NET_TIME", XT_NET_TIME},
-#line 56 "xcsv_tokens.in"
-      {"MAP_EN_BNG", XT_MAP_EN_BNG},
 #line 45 "xcsv_tokens.in"
       {"LAT_DDMMDIR", XT_LAT_DDMMDIR},
 #line 46 "xcsv_tokens.in"
@@ -160,12 +153,14 @@ in_word_set (register const char *str, register unsigned int len)
       {"LAT_DECIMALDIR", XT_LAT_DECIMALDIR},
 #line 33 "xcsv_tokens.in"
       {"ICON_DESCR", XT_ICON_DESCR},
-#line 23 "xcsv_tokens.in"
-      {"GEOCACHE_TYPE", XT_GEOCACHE_TYPE},
+#line 77 "xcsv_tokens.in"
+      {"UTM", XT_UTM},
 #line 69 "xcsv_tokens.in"
       {"SHORTNAME", XT_SHORTNAME},
 #line 73 "xcsv_tokens.in"
       {"TRACK_NAME", XT_TRACK_NAME},
+#line 34 "xcsv_tokens.in"
+      {"IGNORE", XT_IGNORE},
 #line 51 "xcsv_tokens.in"
       {"LON_DIR", XT_LON_DIR},
 #line 66 "xcsv_tokens.in"
@@ -174,92 +169,106 @@ in_word_set (register const char *str, register unsigned int len)
       {"TRACK_NEW", XT_TRACK_NEW},
 #line 54 "xcsv_tokens.in"
       {"LON_DDMMDIR", XT_LON_DDMMDIR},
+#line 9 "xcsv_tokens.in"
+      {"COUNTRY", XT_COUNTRY},
 #line 55 "xcsv_tokens.in"
       {"LON_NMEA", XT_LON_NMEA},
 #line 48 "xcsv_tokens.in"
       {"LON_DECIMALDIR", XT_LON_DECIMALDIR},
-#line 9 "xcsv_tokens.in"
-      {"COUNTRY", XT_COUNTRY},
+#line 56 "xcsv_tokens.in"
+      {"MAP_EN_BNG", XT_MAP_EN_BNG},
+#line 81 "xcsv_tokens.in"
+      {"UTM_EASTING", XT_UTM_EASTING},
 #line 76 "xcsv_tokens.in"
       {"URL", XT_URL},
-#line 72 "xcsv_tokens.in"
-      {"TIMET_TIME", XT_TIMET_TIME},
 #line 14 "xcsv_tokens.in"
       {"FORMAT", XT_FORMAT},
-#line 13 "xcsv_tokens.in"
-      {"FILENAME", XT_FILENAME},
+#line 23 "xcsv_tokens.in"
+      {"GEOCACHE_TYPE", XT_GEOCACHE_TYPE},
 #line 65 "xcsv_tokens.in"
       {"PATH_SPEED", XT_PATH_SPEED},
 #line 59 "xcsv_tokens.in"
       {"PATH_COURSE", XT_PATH_COURSE},
 #line 24 "xcsv_tokens.in"
       {"GMT_TIME", XT_GMT_TIME},
-#line 31 "xcsv_tokens.in"
-      {"HMSG_TIME", XT_HMSG_TIME},
 #line 42 "xcsv_tokens.in"
       {"LAT_HUMAN_READABLE", XT_LAT_HUMAN_READABLE},
-#line 35 "xcsv_tokens.in"
-      {"INDEX", XT_INDEX},
+#line 72 "xcsv_tokens.in"
+      {"TIMET_TIME", XT_TIMET_TIME},
+#line 13 "xcsv_tokens.in"
+      {"FILENAME", XT_FILENAME},
 #line 47 "xcsv_tokens.in"
       {"LOCAL_TIME", XT_LOCAL_TIME},
-#line 43 "xcsv_tokens.in"
-      {"LAT_INT32DEG", XT_LAT_INT32DEG},
-#line 29 "xcsv_tokens.in"
-      {"GPS_VDOP", XT_GPS_VDOP},
+#line 82 "xcsv_tokens.in"
+      {"UTM_NORTHING", XT_UTM_NORTHING},
+#line 35 "xcsv_tokens.in"
+      {"INDEX", XT_INDEX},
 #line 39 "xcsv_tokens.in"
       {"LAT_DECIMAL", XT_LAT_DECIMAL},
 #line 52 "xcsv_tokens.in"
       {"LON_HUMAN_READABLE", XT_LON_HUMAN_READABLE},
+#line 31 "xcsv_tokens.in"
+      {"HMSG_TIME", XT_HMSG_TIME},
 #line 20 "xcsv_tokens.in"
       {"GEOCACHE_LAST_FOUND", XT_GEOCACHE_LAST_FOUND},
-#line 11 "xcsv_tokens.in"
-      {"EXCEL_TIME", XT_EXCEL_TIME},
 #line 44 "xcsv_tokens.in"
       {"LATLON_HUMAN_READABLE", XT_LATLON_HUMAN_READABLE},
-#line 53 "xcsv_tokens.in"
-      {"LON_INT32DEG", XT_LON_INT32DEG},
 #line 8 "xcsv_tokens.in"
       {"CONSTANT", XT_CONSTANT},
+#line 11 "xcsv_tokens.in"
+      {"EXCEL_TIME", XT_EXCEL_TIME},
 #line 49 "xcsv_tokens.in"
       {"LON_DECIMAL", XT_LON_DECIMAL},
 #line 37 "xcsv_tokens.in"
       {"ISO_TIME", XT_ISO_TIME},
-#line 7 "xcsv_tokens.in"
-      {"CITY", XT_CITY},
 #line 60 "xcsv_tokens.in"
       {"PATH_DISTANCE_KM", XT_PATH_DISTANCE_KM},
-#line 27 "xcsv_tokens.in"
-      {"GPS_PDOP", XT_GPS_PDOP},
-#line 26 "xcsv_tokens.in"
-      {"GPS_HDOP", XT_GPS_HDOP},
-#line 75 "xcsv_tokens.in"
-      {"URL_LINK_TEXT", XT_URL_LINK_TEXT},
+#line 7 "xcsv_tokens.in"
+      {"CITY", XT_CITY},
+#line 78 "xcsv_tokens.in"
+      {"UTM_ZONE", XT_UTM_ZONE},
+#line 79 "xcsv_tokens.in"
+      {"UTM_ZONEC", XT_UTM_ZONEC},
+#line 16 "xcsv_tokens.in"
+      {"GEOCACHE_DIFF", XT_GEOCACHE_DIFF},
 #line 32 "xcsv_tokens.in"
       {"HMSL_TIME", XT_HMSL_TIME},
+#line 75 "xcsv_tokens.in"
+      {"URL_LINK_TEXT", XT_URL_LINK_TEXT},
 #line 40 "xcsv_tokens.in"
       {"LAT_DIRDECIMAL", XT_LAT_DIRDECIMAL},
-#line 28 "xcsv_tokens.in"
-      {"GPS_SAT", XT_GPS_SAT},
+#line 83 "xcsv_tokens.in"
+      {"YYYYMMDD_TIME", XT_YYYYMMDD_TIME},
 #line 63 "xcsv_tokens.in"
       {"PATH_SPEED_KPH", XT_PATH_SPEED_KPH},
-#line 12 "xcsv_tokens.in"
-      {"FACILITY", XT_FACILITY},
+#line 3 "xcsv_tokens.in"
+      {"ALT_FEET", XT_ALT_FEET},
 #line 64 "xcsv_tokens.in"
       {"PATH_SPEED_MPH", XT_PATH_SPEED_MPH},
-#line 77 "xcsv_tokens.in"
-      {"YYYYMMDD_TIME", XT_YYYYMMDD_TIME},
+#line 43 "xcsv_tokens.in"
+      {"LAT_INT32DEG", XT_LAT_INT32DEG},
+#line 29 "xcsv_tokens.in"
+      {"GPS_VDOP", XT_GPS_VDOP},
 #line 50 "xcsv_tokens.in"
       {"LON_DIRDECIMAL", XT_LON_DIRDECIMAL},
+#line 12 "xcsv_tokens.in"
+      {"FACILITY", XT_FACILITY},
 #line 61 "xcsv_tokens.in"
       {"PATH_DISTANCE_MILES", XT_PATH_DISTANCE_MILES},
-#line 3 "xcsv_tokens.in"
-      {"ALT_FEET", XT_ALT_FEET},
+#line 28 "xcsv_tokens.in"
+      {"GPS_SAT", XT_GPS_SAT},
+#line 53 "xcsv_tokens.in"
+      {"LON_INT32DEG", XT_LON_INT32DEG},
+#line 26 "xcsv_tokens.in"
+      {"GPS_HDOP", XT_GPS_HDOP},
 #line 25 "xcsv_tokens.in"
       {"GPS_FIX", XT_GPS_FIX},
-#line 16 "xcsv_tokens.in"
-      {"GEOCACHE_DIFF", XT_GEOCACHE_DIFF},
+#line 80 "xcsv_tokens.in"
+      {"UTM_ZONEF", XT_UTM_ZONEF},
 #line 57 "xcsv_tokens.in"
       {"NOTES", XT_NOTES},
+#line 27 "xcsv_tokens.in"
+      {"GPS_PDOP", XT_GPS_PDOP},
 #line 62 "xcsv_tokens.in"
       {"PATH_SPEED_KNOTS", XT_PATH_SPEED_KNOTS},
 #line 36 "xcsv_tokens.in"
@@ -271,19 +280,19 @@ in_word_set (register const char *str, register unsigned int len)
   static signed char lookup[] =
     {
       -1, -1, -1, -1, -1,  0, -1, -1, -1, -1,  1,  2,  3,  4,
-      -1,  5,  6,  7,  8,  9, 10, 11, -1, 12, -1, 13, 14, 15,
-      16, -1, 17, 18, -1, 19, 20, 21, -1, -1, 22, 23, 24, -1,
-      25, 26, 27, -1, 28, -1, 29, 30, -1, -1, 31, 32, -1, 33,
-      34, -1, 35, -1, 36, 37, -1, 38, 39, -1, -1, -1, 40, -1,
-      41, -1, -1, -1, -1, 42, -1, 43, 44, -1, -1, 45, -1, 46,
-      -1, -1, -1, -1, -1, 47, 48, 49, 50, 51, -1, -1, 52, -1,
-      53, 54, -1, 55, -1, 56, -1, -1, -1, -1, 57, -1, -1, -1,
-      -1, 58, 59, -1, -1, -1, -1, 60, -1, -1, 61, -1, 62, -1,
-      -1, -1, 63, 64, -1, -1, -1, 65, 66, -1, -1, -1, -1, 67,
-      -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, -1, 69, 70,
-      -1, -1, -1, -1, -1, -1, 71, -1, -1, -1, -1, -1, 72, -1,
-      -1, -1, -1, 73, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      -1, -1, -1, 74
+      -1,  5,  6,  7,  8,  9, 10, -1, -1, 11, -1, 12, 13, 14,
+      15, -1, -1, 16, -1, 17, 18, 19, -1, -1, 20, 21, 22, 23,
+      24, 25, 26, -1, 27, 28, 29, 30, 31, 32, -1, 33, -1, -1,
+      34, -1, 35, -1, 36, 37, -1, 38, -1, -1, -1, -1, 39, -1,
+      40, -1, -1, 41, -1, 42, -1, 43, -1, -1, 44, 45, -1, 46,
+      47, -1, -1, -1, -1, 48, -1, 49, -1, 50, -1, 51, 52, -1,
+      53, -1, -1, 54, -1, -1, 55, -1, -1, -1, 56, 57, -1, -1,
+      -1, 58, 59, -1, -1, -1, 60, 61, -1, -1, -1, 62, 63, -1,
+      -1, -1, 64, 65, -1, -1, 66, 67, 68, -1, -1, -1, 69, 70,
+      -1, -1, 71, -1, -1, -1, -1, 72, 73, -1, -1, -1, -1, -1,
+      -1, -1, -1, 74, -1, 75, 76, -1, -1, 77, -1, -1, 78, -1,
+      -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+      -1, -1, -1, 80
     };
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
index 3d7f1013ce5e8babe50ee5f1ceda1e7c6e2b5dd8..35e1a0ca223cd7d66f7f4e3b5070afe1f93387b5 100644 (file)
@@ -74,4 +74,10 @@ TRACK_NAME, XT_TRACK_NAME
 TRACK_NEW, XT_TRACK_NEW
 URL_LINK_TEXT, XT_URL_LINK_TEXT
 URL, XT_URL
+UTM, XT_UTM
+UTM_ZONE, XT_UTM_ZONE
+UTM_ZONEC, XT_UTM_ZONEC
+UTM_ZONEF, XT_UTM_ZONEF
+UTM_EASTING, XT_UTM_EASTING
+UTM_NORTHING, XT_UTM_NORTHING
 YYYYMMDD_TIME, XT_YYYYMMDD_TIME